package leetcode.pre100;

/**
 * 给你两个二进制字符串，返回它们的和（用二进制表示）。
 * <p>
 * 输入为 非空 字符串且只包含数字 1 和 0。
 * <p>
 *  
 * <p>
 * 示例 1:
 * <p>
 * 输入: a = "11", b = "1"
 * 输出: "100"
 * 示例 2:
 * <p>
 * 输入: a = "1010", b = "1011"
 * 输出: "10101"
 *  
 * <p>
 * 提示：
 * <p>
 * 每个字符串仅由字符 '0' 或 '1' 组成。
 * 1 <= a.length, b.length <= 10^4
 * 字符串如果不是 "0" ，就都不含前导零。
 * <p>
 *
 * @date 2020/6/6 15:53
 */
public class Code67_AddBinary_二进制求和 {
    public static void main(String[] args) {
//        StringBuffer sb = new StringBuffer();
//        sb.append(1);
//        System.out.println(sb.toString());
        System.out.println(addBinary("11", "1"));
    }
    public static String addBinary(String a, String b) {
        if (a == null || b == null)
            return a == null ? b : a;
        if (a.isEmpty() || b.isEmpty())
            return a.isEmpty() ? b : a;
        if (a.equals("0") || b.equals("0"))
            return a.equals("0") ? b : a;
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        int sum = 0;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0 || carry > 0) {
            int m = i >= 0 ? a.charAt(i--) - '0' : 0;
            int n = j >= 0 ? b.charAt(j--) - '0' : 0;
            sum = m + n + carry;
            // 1 + 1
            carry = sum / 2;
            sb.append(sum % 2);
        }
        return sb.reverse().toString();
    }
}
